package dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import model.AbstractModel;
import model.Computador;
import model.EnumUtil;
import model.Hardware;
import model.Periferico;
import model.Software;

public class ComputadorDAO extends PersistenciaDAO {

	private SoftwareDAO softwareDAO;

	@Override
	public boolean inserir(AbstractModel object) {
		Boolean result = Boolean.FALSE;
		super.inserir(object);
		int idComputadorGravado = 0;
		try {
			idComputadorGravado = buscarUltimoId();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		Computador computador = (Computador)object;

		for (Periferico p: computador.getPerifericos()) {
			String sql = "Insert into computadorperiferico ( "+
			" cd_computador, cd_periferico ) "+
			"values ( " + idComputadorGravado + ", " + p.getId() + " )" ;

			PreparedStatement pstmt;
			try {
				pstmt = connection.prepareStatement(sql);
				pstmt.execute();
				System.out.println(" Objeto inserido no banco de dados");
				result = Boolean.TRUE;
			} catch (SQLException e) {
				System.out.println("Erro ao inserir");
				System.out.println(sql);
				e.printStackTrace();
			}
		}
		for (Software s: computador.getSoftwares()) {
			String sql = "Insert into computadorsoftware ( "+
			" cd_computador, cd_software ) "+
			"values ( " + idComputadorGravado + ", " + s.getId() + " )" ;

			PreparedStatement pstmt;
			try {
				pstmt = connection.prepareStatement(sql);
				pstmt.execute();
				System.out.println(" Objeto inserido no banco de dados");
				result = Boolean.TRUE;
			} catch (SQLException e) {
				System.out.println("Erro ao inserir");
				System.out.println(sql);
				e.printStackTrace();
			}
		}
		for (Hardware h: computador.getHardwares()) {
			String sql = "Insert into computadorhardware ( "+
			" cd_computador, cd_hardware ) "+
			"values ( " + idComputadorGravado + ", " + h.getId() + " )" ;

			PreparedStatement pstmt;
			try {
				pstmt = connection.prepareStatement(sql);
				pstmt.execute();
				System.out.println(" Objeto inserido no banco de dados");
				result = Boolean.TRUE;
			} catch (SQLException e) {
				System.out.println("Erro ao inserir");
				System.out.println(sql);
				e.printStackTrace();
			}
		}
		return result;
	}

	@Override
	public boolean alterar(AbstractModel object) {
		Boolean result = Boolean.FALSE;
		super.alterar(object);

		Computador computador = (Computador)object;

		//DELETAR OS

		String sqlDeletarHardware = "DELETE FROM computadorhardware WHERE cd_computador = " + computador.getId();

		PreparedStatement pstmt;
		try {
			pstmt = connection.prepareStatement(sqlDeletarHardware);
			pstmt.execute();
			System.out.println(" Objeto deletado no banco de dados");
		} catch (SQLException e) {
			System.out.println("Erro ao deletar");
			System.out.println(sqlDeletarHardware);
			e.printStackTrace();
		}

		String sqlDeletarSoftware =	"DELETE FROM computadorsoftware WHERE cd_computador = " + computador.getId();

		try {
			pstmt = connection.prepareStatement(sqlDeletarSoftware);
			pstmt.execute();
			System.out.println(" Objeto deletado no banco de dados");
		} catch (SQLException e) {
			System.out.println("Erro ao deletar");
			System.out.println(sqlDeletarSoftware);
			e.printStackTrace();
		}

		String sqlDeletarPeriferico = "DELETE FROM computadorperiferico WHERE cd_computador = " + computador.getId() + ";";

		try {
			pstmt = connection.prepareStatement(sqlDeletarPeriferico);
			pstmt.execute();
			System.out.println(" Objeto deletado no banco de dados");
		} catch (SQLException e) {
			System.out.println("Erro ao deletar");
			System.out.println(sqlDeletarPeriferico);
			e.printStackTrace();
		}

		for (Periferico p: computador.getPerifericos()) {
			String sql = "Insert into computadorperiferico ( "+
			" cd_computador, cd_periferico ) "+
			"values ( " + computador.getId() + ", " + p.getId() + " )" ;

			try {
				pstmt = connection.prepareStatement(sql);
				pstmt.execute();
				System.out.println(" Objeto inserido no banco de dados");
				result = Boolean.TRUE;
			} catch (SQLException e) {
				System.out.println("Erro ao inserir");
				System.out.println(sql);
				e.printStackTrace();
			}
		}
		for (Software s: computador.getSoftwares()) {
			String sql = "Insert into computadorsoftware ( "+
			" cd_computador, cd_software ) "+
			"values ( " + computador.getId() + ", " + s.getId() + " )" ;

			try {
				pstmt = connection.prepareStatement(sql);
				pstmt.execute();
				System.out.println(" Objeto inserido no banco de dados");
				result = Boolean.TRUE;
			} catch (SQLException e) {
				System.out.println("Erro ao inserir");
				System.out.println(sql);
				e.printStackTrace();
			}
		}
		for (Hardware h: computador.getHardwares()) {
			String sql = "Insert into computadorhardware ( "+
			" cd_computador, cd_hardware ) "+
			"values ( " + computador.getId() + ", " + h.getId() + " )" ;

			try {
				pstmt = connection.prepareStatement(sql);
				pstmt.execute();
				System.out.println(" Objeto inserido no banco de dados");
				result = Boolean.TRUE;
			} catch (SQLException e) {
				System.out.println("Erro ao inserir");
				System.out.println(sql);
				e.printStackTrace();
			}
		}
		return result;
	}
	
	@Override
	public boolean delete(AbstractModel object) {
			Boolean result = Boolean.FALSE;
			super.delete(object);

			Computador computador = (Computador)object;

			//DELETAR OS

			String sqlDeletarHardware = "DELETE FROM computadorhardware WHERE cd_computador = " + computador.getId();

			PreparedStatement pstmt;
			try {
				pstmt = connection.prepareStatement(sqlDeletarHardware);
				pstmt.execute();
				System.out.println(" Objeto deletado no banco de dados");
			} catch (SQLException e) {
				System.out.println("Erro ao deletar");
				System.out.println(sqlDeletarHardware);
				e.printStackTrace();
			}

			String sqlDeletarSoftware =	"DELETE FROM computadorsoftware WHERE cd_computador = " + computador.getId();

			try {
				pstmt = connection.prepareStatement(sqlDeletarSoftware);
				pstmt.execute();
				System.out.println(" Objeto deletado no banco de dados");
			} catch (SQLException e) {
				System.out.println("Erro ao deletar");
				System.out.println(sqlDeletarSoftware);
				e.printStackTrace();
			}

			String sqlDeletarPeriferico = "DELETE FROM computadorperiferico WHERE cd_computador = " + computador.getId() + ";";

			try {
				pstmt = connection.prepareStatement(sqlDeletarPeriferico);
				pstmt.execute();
				System.out.println(" Objeto deletado no banco de dados");
			} catch (SQLException e) {
				System.out.println("Erro ao deletar");
				System.out.println(sqlDeletarPeriferico);
				e.printStackTrace();
			}

		return result;
	}

	public Computador buscarComputadorPorId(int id) throws SQLException, Exception {
		Computador result = null;
		Statement sta = connection.createStatement();
		ResultSet elements = sta
		.executeQuery("SELECT * FROM computador WHERE cd_computador = "	+ id);

		while (elements.next()) {
			result = montarComputador(elements);
		}
		return result;
	}

	public Collection<Computador> buscarComputadores() throws SQLException, Exception {

		Collection<Computador> result = new ArrayList<Computador>();
		Statement sta = connection.createStatement();
		ResultSet elements = sta.executeQuery("select * from computador");

		while (elements.next()) {
			Computador computador = montarComputador(elements);
			result.add(computador);
		}
		return result;
	}

	public int buscarUltimoId() throws SQLException {
		int result = 0;
		Statement sta = connection.createStatement();
		ResultSet elements = sta
		.executeQuery("SELECT cd_computador " +
		" FROM computador ORDER BY cd_computador DESC LIMIT 1 ");

		while (elements.next()) {
			result = elements.getInt("cd_computador");
		}
		return result;

	}

	public Collection<HashMap<String, Object>> buscarDadosComputadorBrowse() throws SQLException {

		Collection<HashMap<String, Object>> result = new ArrayList<HashMap<String,Object>>();
		Statement sta = connection.createStatement();
		ResultSet elements = sta.executeQuery(
				" SELECT c.cd_computador as codigo, "+
				"  		c.ds_computador as descricao "+
				" FROM quiosque.computador c "+
		" ORDER BY c.cd_computador ");

		while (elements.next()) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("codigo", elements.getInt("codigo"));
			map.put("descricao", elements.getString("descricao"));
			result.add(map);
		}
		return result;
	}

	public Computador montarComputador(ResultSet elements) throws SQLException, Exception {
		Computador computador = new Computador();
		computador.setId(elements.getInt("cd_computador"));
		computador.setDescricao(elements.getString("ds_computador"));
		computador.setEnderecoMac(elements.getString("ds_enderecomac"));
		computador.setEnderecoIp(elements.getString("ds_enderecoip"));
		computador.setSistemaOperacional(getSoftwareDAO().buscarSoftwarePorId(elements.getInt("cd_sistema_operacional")));
		String situacao = elements.getString("tp_situacao");
		computador.setSituacao(EnumUtil.getSituacaoApartirValue(situacao));

		computador.setHardwares(new HardwareDAO().buscarHardwarePorComputador(elements.getInt("cd_computador")));
		computador.setSoftwares(getSoftwareDAO().buscarSoftwarePorComputador(elements.getInt("cd_computador")));
		computador.setPerifericos(new PerifericoDAO().buscarPerifericoPorComputador(elements.getInt("cd_computador")));

		return computador;
	}

	public SoftwareDAO getSoftwareDAO() {
		if (softwareDAO == null){
			softwareDAO = new SoftwareDAO();
		}
		return softwareDAO;
	}
}